Software compatibility is an important aspect of the software industry. Software compatibility essentially relates to the ability of software to be used in different environments such as those provided under dissimilar operating systems. Software compatibility can be broadly divided into two categories. The first category deals with source level compatibility, which relates to allowing source code to be used in different environments. The second category deals with binary compatibility, which relates to a compiled (binary) program's ability to be executed in different environments.
Whilst there exists various techniques for providing source level compatibility, those techniques have significant shortcomings. For example, object versioning used with the GNU C library (glibc) involves creating a new version of the glibc library whenever an object (routine) in the library is updated such that the updated object is incompatible with early versions of the object. A new version of the glibc library creating using object versioning is such that it contains sources (code) for all versions of objects contained in the library. As a result, the glibc library can become bulky because it contains all versions of the objects.
Another problem closely associated with object versioning in glibc is that dynamic linkers based on object versioning tend to fail the application linking process if the available glibc library does not contain the specific version of an object that the linker requires.
A further example of an existing technique used to provide source level compatibility is function level versioning in HP-UX libraries. Function level versioning is similar to objecting versioning in the glibc library in that it involves creating a new library that contains all versions of a particular object. As mentioned previously, creating a new library that contains all versions of an object has the potential to produce bulky libraries.